const addressApi = require('../../utils/addressApi.js');

Page({
  /**
   * 页面的初始数据
   */
  data: {
    name: "",
    phone: "",
    provinceName: "",
    cityName: "",
    districtName: "",
    detailAddress: "",
    isDefault: false,
    // 布尔值：false否 true是
    editId: null,
    addressPage: null,
  },

  /**
   * 生命周期函数--监听页面加载
   */
  // 页面第一次加载时触发 仅执行一次
  onLoad(options) {
    // options 接收收货地址传递的参数对象
    this.setData({
      editId: options.id || null,
      // 解释从收货地址传递的id，有id是编辑页面，无新增页面
    });
    
    // 当有编辑id时，开启编辑模式
    if (this.data.editId) {
      this.loadEditData();
      // loadEditData 加载编辑数据
      wx.setNavigationBarTitle({
        // 修改页面标题
        title: "编辑收货地址",
      });
    }
  },
  
  // 加载编辑数据
  async loadEditData() {
    try {
      wx.showLoading({
        title: '加载中...',
      });
      
      const { editId } = this.data;
      // 调用API获取地址详情
      const addressData = await addressApi.getAddressById(editId);
      
      if (addressData) {
        this.setData({
          name: addressData.receiverName,
          phone: addressData.receiverPhone,
          provinceName: addressData.provinceName,
          cityName: addressData.cityName,
          districtName: addressData.districtName,
          detailAddress: addressData.detail,
          isDefault: addressData.defaultAddress === 1,
        });
      }
      
      wx.hideLoading();
    } catch (error) {
      wx.hideLoading();
      console.error('获取地址详情失败:', error);
      wx.showToast({
        title: '获取地址详情失败',
        icon: 'none'
      });
    }
  },
  // 拆分函数
  splitFullAddress(fullAddress) {
    //  fullAddress参数
    let province = "",
      city = "",
      district = "",
      detail = "";
    // 初始化地址
    const addArr = fullAddress.split("市");
    // 情况1，地址为直辖市
    // addArr 地址数组
    // 按照市进行分割完整地址
    if (addArr.length >= 2) {
      province = addArr[0] + "市";
      // 省份=第一个数组 市分割后左侧的内容：北京
      const rest = addArr[1];
      // 剩余部分：第二个数组 市右侧所有内容 东城区....
      const districtMatch = rest.match(/^([^路巷街号]+[区县])/);
      // 正则表达式 ‘/内容/’标记正则开始和结束
      // ^ 表示匹配输入字符串的开始位置
      // $ 表示匹配输入字符串的结束位置
      //  ()需要提取内容：区/县  []字符串
      // [^路街巷号] 非（不匹配）+量词 [^路巷街号]出现一次或多次
      if (districtMatch) {
        // 如果成功提取区/县
        district = districtMatch[1];
        // districtMatch[0] 是整个匹配结果（完整字符串）
        // districtMatch[1] 提取的区县名称
        detail = rest.replace(district, "");
        city = province;
      } else {
        // 没有区
        city = province;
        detail = rest;
      }
    } else {
      // 情况2，正常省市区
      province = fullAddress.slice(0, 2) + "省";
      // slice字符串截取 提取完整地址前两个字
      // 字符串.slice(开始位置, 结束位置)
      city = fullAddress.slice(2, 4) + "市";
      detail = fullAddress.slice(4);
      // 截取到 endIndex - 1为止
      // 如果省略 endIndex，则默认截取到字符串的末尾
    }
    // 返回拆分后的地址
    return { province, city, district, detail };
  },
  onAddressChange(e) {
    // 地址变化后的自定义函数
    // event 事件
    const [province, city, district] = e.detail.value;
    // 从事件详情获取省市区
    this.setData({
      // 地址改变后，更新当前的data数据
      provinceName: province,
      cityName: city,
      districtName: district,
    });
  },
  // 定位函数
  onLocation() {
    this.setData({
      provinceName: "北京市",
      cityName: "北京市",
      districtName: "东城区",
      detailAddress: "世纪大道花木街道",
    });
    wx.showToast({
      // 显示定位成功的弹窗
      title: "定位成功",
    });
  },
  // 检查表单验证
  checkForm() {
    const { name, phone, provinceName, detailAddress } = this.data;
    // 在当前data数据里获取需要检查的值
    // 验证1，收货人姓名是否为空
    if (!name.trim()) return "请输入收货人姓名";
    // trim()空格处理 去除字符串开头和结尾的空白字符
    // 验证2，收货人手机号是否合法
    if (!/^1\d{10}$/.test(phone.trim())) return "请输入正确的手机号";
    // ‘/内容/’ 正则表达式内容
    //^ 表示匹配输入字符串的开始位置
    //$ 表示匹配输入字符串的结束位置
    // \d匹配数字 {10}字符串位数
    // ^1手机号必须以1开头，\d{10}后续匹配10位数，手机号为11位数
    // test(phone.trim()) 正则表达式清除去除字符串开头和结尾的空白字符
    // 验证3，所在地区是否为空
    if (!provinceName) return "请选择所在地区";
    // 验证4，详细地址是否为空
    if (!detailAddress.trim()) return "请输入详细地址";
    // 验证成功后的返回值
    return "";
    // 空字符代表没有错误弹窗，所有验证通过
  },
  // 保存按钮
  async saveAddress() {
    const { editId } = this.data;
    const errMsg = this.checkForm();
    
    if (errMsg) {
      return wx.showToast({
        title: errMsg,
        icon: "none",
      });
    }
    
    try {
      wx.showLoading({
        title: '保存中...',
      });
      
      // 获取用户ID，这里假设从全局数据中获取，实际项目中可能需要从登录状态中获取
      const userId = wx.getStorageSync('userId') || 1;
      
      const {
        name,
        phone,
        provinceName,
        cityName,
        districtName,
        detailAddress,
        isDefault,
      } = this.data;
      
      // 准备地址数据
      const addressData = {
        userId,
        receiverName: name.trim(),
        receiverPhone: phone.trim(),
        provinceName,
        cityName,
        districtName,
        detail: detailAddress.trim(),
        defaultAddress: isDefault ? 1 : 0
      };
      
      // 根据是否有editId判断是新增还是编辑
      if (editId) {
        // 编辑模式
        await addressApi.updateAddress(editId, addressData);
        wx.showToast({
          title: '编辑地址成功',
          icon: 'none'
        });
      } else {
        // 新增模式
        await addressApi.createAddress(addressData);
        wx.showToast({
          title: '新增地址成功',
          icon: 'none'
        });
      }
      
      wx.hideLoading();
      
      // 延迟返回上一页
      setTimeout(() => {
        wx.navigateBack();
      }, 800);
      
    } catch (error) {
      wx.hideLoading();
      console.error('保存地址失败:', error);
      wx.showToast({
        title: '保存地址失败',
        icon: 'none'
      });
    }
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {},

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {},

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {},

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {},

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {},

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {},

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {},
});
